package main
import (
	"fmt"
	"math"
)
/*
	函数也是值，可以像其他值一样传递。
	函数值可以用作函数的参数或返回值
*/
func compute(fn func(float64, float64) float64) float64{
	return fn(3, 4)
}
//函数闭包
/*
	闭包是一个函数值，它引用了其函数体之外的变量。该函数体可以访问并赋予其引用的变量值，即函数被这些变量绑定在一起
*/
func adder() func (int) int {
	sum := 0
	return func (x int) int {
		sum += x
		return sum
	}
}
func main(){
	//demo1 函数值
	hypot := func (x, y float64) float64{
		return math.Sqrt(x*x + y*y)
	}
	fmt.Println(hypot(5,12))//13
	fmt.Println(compute(hypot))//5
	fmt.Println(compute(math.Pow))//81


	//demo2 函数闭包
	pos, reg := adder(), adder()
	for i := 0; i < 10; i++ {
		fmt.Println(
			pos,
			reg(-2 * i),
		)
	}

}